package org.subatu.orm.query.condition;


import org.springframework.util.Assert;
import org.subatu.orm.query.base.BaseSql;
import org.subatu.orm.query.brige.DistinctFrom;
import org.subatu.orm.query.function.FunctionToQueryColumnUtil;
import org.subatu.orm.query.function.SFunction;
import org.subatu.orm.query.table.QueryColumn;

import java.util.Arrays;
import java.util.List;

/**
 * 查询
 */
public interface Select extends Distinct, BaseSql {

    // 查询部分的sql
    // StringBuilder sqlData().selectSql = new StringBuilder();

    default DistinctFrom select(QueryColumn... selectColumns) {
        sqlData().selectList.clear();
        // 加入到查询队列
        sqlData().selectList.addAll(Arrays.asList(selectColumns));
        return (DistinctFrom) this;
    }

    default <E> DistinctFrom select(SFunction<E>... selectFunctions) {
        sqlData().selectList.clear();
        List<QueryColumn> selectColumns = FunctionToQueryColumnUtil.toQueryColumn(selectFunctions);
        sqlData().selectList.addAll(selectColumns);
        return (DistinctFrom) this;
    }

    default DistinctFrom select(String sql) {
        sqlData().selectSql.setLength(0);
        // 加入到查询队列
        sqlData().selectSql.append("SELECT ").append(sql);
        return (DistinctFrom) this;
    }

    default String buildSelectSql() {
        if (sqlData().selectSql.length() > 0) {
            // 如果手工设置了 sql, 直接返回
            return sqlData().selectSql.toString();
        }
        Assert.notEmpty(sqlData().selectList, ".select() 不能为空.请设置查询字段");

        // 组装 sql
        sqlData().selectSql.setLength(0);
        sqlData().selectSql.append("select ");
        sqlData().selectSql.append(sqlData().distinct);

        // 组装所有 列
        for (QueryColumn queryColumn : sqlData().selectList) {
            String tableAlias = this.sqlData().tableAliasMap.get(queryColumn.getTable().getTableName());
            String columnSql = queryColumn.buildSql(tableAlias);
            sqlData().selectSql.append(columnSql);
        }
        // 去掉 列 最后的逗号
        sqlData().selectSql.deleteCharAt(sqlData().selectSql.length() - 1);
        sqlData().selectSql.append(' ');

        return sqlData().selectSql.toString();
    }
}
